package com.svms.save.services;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.springframework.beans.factory.annotation.Autowired;

import com.svms.save.entitys.SvdaYhb;
import com.svms.save.importexcel.utils.ReflectUtils;
import com.svms.save.mapper.CommonMapper;
import com.svms.save.utils.SysCode;

public abstract class BaseService {
	@Autowired
	private CommonMapper commonMapper;
	/**
	 * 
	 * <p>
	 * Title: 设置实体默认值
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @author xuyang
	 * @date 2020年11月25日
	 * @param beanObj 实体对象
	 * @param user    用户对象
	 */
	public void setEntityDefVal(SvdaYhb user, Object beanObj) {
		String nowDate = commonMapper.dataBaseDateStr();
		String czbs = (String) this.getProperty(beanObj, "czbs");
		String userId = user.getYhm();
		String dwdm = "000000000000";
		if(null == czbs) {
			this.setProperty(beanObj, "czbs", SysCode.CZBS_ADD);
		}else if(czbs.equals(SysCode.CZBS_ADD)) {
			this.setProperty(beanObj, "czbs", SysCode.CZBS_UPDATE);
		}
		if (null != user) {
			this.setProperty(beanObj, "czsj", nowDate);
			this.setProperty(beanObj, "czr", userId);
			this.setProperty(beanObj, "czdw", dwdm);
		}
	}

	/**
	 * 
	 * <p>
	 * Title: 反射执行set方法
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @author xuyang
	 * @date 2020年11月25日
	 * @param beanObj
	 * @param fName
	 * @param value
	 */
	public void setProperty(Object beanObj, String fName, Object value) {
		ReflectUtils.invokeSet(beanObj, fName, new Object[] {value});
		/*
		try {
			Field[] fields = beanObj.getClass().getDeclaredFields();// 获得属性
			Class clazz = beanObj.getClass();
			for (int i = 0; i < fields.length; i++) {
				Field field = fields[i];
				if (fName.equals(field.getName())) {
					// 此处应该判断beanObj,property不为null
					PropertyDescriptor pd = new PropertyDescriptor(field.getName(), beanObj.getClass());
					Method setMethod = pd.getWriteMethod();
					if (setMethod != null) {
						// 这里注意实体类中set方法中的参数类型，如果不是String类型则进行相对应的转换
						setMethod.invoke(beanObj, value);// invoke是执行set方法
					}
					break;
				}
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (IntrospectionException e) {
			e.printStackTrace();
		}*/
	}

	/**
	 * 
	 * <p>
	 * Title: 反射执行get方法
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @author xuyang
	 * @date 2020年11月25日
	 * @param beanObj
	 * @param fName
	 * @return
	 */
	public Object getProperty(Object beanObj, String fName) {
		Object res = null;
		try {
			Field[] fields = beanObj.getClass().getDeclaredFields();// 获得属性
			Class clazz = beanObj.getClass();
			for (int i = 0; i < fields.length; i++) {
				Field field = fields[i];
				// 此处应该判断beanObj,property不为null
				PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
				Method getMethod = pd.getReadMethod();
				if (fName.equals(field.getName())) {
					if (getMethod != null) {
						res = getMethod.invoke(beanObj);
						break;
					}
				}
			}
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (IntrospectionException e) {
			e.printStackTrace();
		}
		return res;
	}
}
